﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Text;
//librerias especiales para la BD
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace CityGames
{
    public class CADCopiaFisica
    {
        static private string cadConexion = System.Configuration.ConfigurationManager.ConnectionStrings["CityGames.Properties.Settings.BDCityGamesConnectionString"].ConnectionString;
        static private DSCopiaFisicaTableAdapters.CopiasFisicasTA copiasFisicasTA = new DSCopiaFisicaTableAdapters.CopiasFisicasTA();

        /************************************************** Funciones de Marcos **************************************************/

        /// <summary>
        /// Función para obtener un DataSet que contiene una tabla con el nombre especificado por parámetro con los datos obtenidos al ejecutar la sentencia select pasada por parámetro
        /// </summary>
        /// <param name="select">
        /// Sentencia SQL Select que se desea ejecutar</param>
        /// <param name="nombreTabla">
        /// Nombre de la tabla que contendrá los datos dentro del DataSet que devuelve la función</param>
        /// <returns>
        /// Devuelve un DataSet con una tabla de nombre especificado por parametro con los datos obtenidos al ejecutar la sentencia select pasada por parámetro</returns>
        public DataSet ObtenerDatos(string select, string nombreTabla)
        {
            DataSet resultado = new DataSet();

            try
            {
                SqlConnection conexion = new SqlConnection(cadConexion);
                SqlDataAdapter da = new SqlDataAdapter(select, conexion);
                da.Fill(resultado, nombreTabla);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Función para insertar un nuevo elemento en la tabla CopiaAlquiler con el código pasado por parámetro, asociando así que la copia física correspondiente al código corresponde a una copia para Alquilar
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego que se desea insertar</param>
        /// <param name="platafomraJuego">
        /// Plataforma del juego que se desea insertar</param>
        /// <returns>
        /// Devuelve True si se ha podido realizar la inserción, False en caso contrario</returns>
        public bool InsertarCopiaAlquiler(string nombreJuego, string plataformaJuego)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlTransaction tr = null;
            SqlCommand comandoSql;
            string insert = "";

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();
                
                tr = conexion.BeginTransaction();

                int codigoMaximo = ObtenerCodigoMaximo();

                insert += "INSERT INTO CopiaFisica (Codigo, NombreJuego, Plataforma) ";
                insert += "VALUES (@codigo, @nombreJuego, @plataformaJuego)";
                
                comandoSql = new SqlCommand(insert, conexion);
                comandoSql.Parameters.Add("@codigo", SqlDbType.Int);
                comandoSql.Parameters["@codigo"].Value = codigoMaximo + 1;
                comandoSql.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombreJuego"].Value = nombreJuego;
                comandoSql.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataformaJuego"].Value = plataformaJuego;
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                insert = "INSERT INTO CopiaAlquiler (Codigo) ";
                insert += "VALUES (@codigo)";

                comandoSql = new SqlCommand(insert, conexion);
                comandoSql.Parameters.Add("@codigo", SqlDbType.Int);
                comandoSql.Parameters["@codigo"].Value = codigoMaximo + 1;
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                tr.Commit();
                resultado = true;
            }
            catch (Exception ex)
            {
                tr.Rollback();
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para insertar una copia física en la tabla CopiaVenta con los valores especificados por parámetro, especificando así que la copia física correspondiente al código es una copia para vender
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego que se desea insertar</param>
        /// <param name="platafomraJuego">
        /// Plataforma del juego que se desea insertar</param>
        /// <param name="tipo">
        /// Tipo de la copia física que se desea insertar en la tabla CopiaVenta. "Nueva" corresponde a una copia nueva para vender y "Segunda Mano" corresponde a una copia de segunda mano</param>
        /// <returns>
        /// Devuelve True si se ha podido realizar la inserción, False en caso contrario</returns>
        public bool InsertarCopiaVenta(string nombreJuego, string plataformaJuego, string tipo)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlTransaction tr = null;
            SqlCommand comandoSql;
            string insert = "";

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                tr = conexion.BeginTransaction();

                int codigoMaximo = ObtenerCodigoMaximo();

                insert += "INSERT INTO CopiaFisica (Codigo, NombreJuego, Plataforma) ";
                insert += "VALUES (@codigo, @nombreJuego, @plataformaJuego)";

                comandoSql = new SqlCommand(insert, conexion);
                comandoSql.Parameters.Add("@codigo", SqlDbType.Int);
                comandoSql.Parameters["@codigo"].Value = codigoMaximo + 1;
                comandoSql.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombreJuego"].Value = nombreJuego;
                comandoSql.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataformaJuego"].Value = plataformaJuego;
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                insert = "INSERT INTO CopiaVenta (Codigo, Tipo) ";
                insert += "VALUES (@codigo, @tipo)";

                comandoSql = new SqlCommand(insert, conexion);
                comandoSql.Parameters.Add("@codigo", SqlDbType.Int);
                comandoSql.Parameters["@codigo"].Value = codigoMaximo + 1;
                comandoSql.Parameters.Add("@tipo", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@tipo"].Value = tipo;
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                tr.Commit();
                resultado = true;
            }
            catch (Exception ex)
            {
                tr.Rollback();
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener el número de todas las copias físicas de un juego determinado por parámetro
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se desea obtener el número de copias físicas</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se desea obtener el número de copias físicas</param>
        /// <returns>
        /// Devuelve el número de copias físicas del juego especificado por parámetro</returns>
        public int ObtenerTodasLasCopiasFisicas(string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) FROM CopiaFisica WHERE (NombreJuego = @nombreJuego) AND (Plataforma = @plataformaJuego)";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombreJuego"].Value = nombreJuego;
                comandoSql.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataformaJuego"].Value = plataformaJuego;
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener los datos de todas las copias físicas de un juego paginadas
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se desean obtener los datos de las copias físicas paginadas</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se desean obtener los datos de las copias físicas paginadas</param>
        /// <param name="desde">
        /// Número correspondiente a la fila desde la cual se comenzaran a obtener los datos de la Base de Datos para la paginación</param>
        /// <param name="hasta">
        /// Número correspondiente a la fila hasta la cual se obtendrán los datos de la Base de Datos para la paginación</param>
        /// <returns>
        /// Devuelve un DataSet con los datos de las copias físicas paginadas dentro de una tabla denominada "CopiasFisicasPaginadas"</returns>
        public DataSet ObtenerTodasLasCopiasFisicasPaginadas(string nombreJuego, string plataformaJuego, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Codigo, NombreJuego, Plataforma ";
                select += "FROM          (SELECT Codigo, NombreJuego, Plataforma, ROW_NUMBER() OVER (ORDER BY Codigo ASC) AS ROW ";
                select += "FROM         CopiaFisica ";
                select += "WHERE        (NombreJuego = '" + nombreJuego + "') AND (Plataforma = '" + plataformaJuego + "')) AS CopiasFisicasNumeradas ";
                select += "WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasFisicasPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Función para obtener el número de copias físicas para alquilar de un juego especificado por parámetro
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se obtendrá el número de copias físicas para alquilar</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se obtendrá el número de copias físicas para alquilar</param>
        /// <returns>
        /// Devuelve el número de copias físicas para alquilar del juego especificado por parámetro</returns>
        public int ObtenerTodasLasCopiasFisicasParaAlquilar(string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) FROM CopiaAlquiler, CopiaFisica WHERE (CopiaFisica.Codigo = CopiaAlquiler.Codigo) AND (NombreJuego = @nombreJuego) AND (Plataforma = @plataformaJuego)";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombreJuego"].Value = nombreJuego;
                comandoSql.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataformaJuego"].Value = plataformaJuego;
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener los datos de las copias físicas para alquilar del juego especificado por parámetro paginadas
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se desea obtener los datos de las copias físicas para alquilar paginadas</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se desea obtener los datos de las copias físicas para alquilar paginadas</param>
        /// <param name="desde">
        /// Número correspondiente a la fila desde la cual se comenzaran a obtener los datos de la Base de Datos para la paginación</param>
        /// <param name="hasta">
        /// Número correspondiente a la fila hasta la cual se obtendrán los datos de la Base de Datos para la paginación</param>
        /// <returns>
        /// Devuelve un DataSet con los datos de las copias físicas para alquilar paginadas dentro de una tabla denominada "CopiasAlquilerPaginadas"</returns>
        public DataSet ObtenerTodasLasCopiasFisicasParaAlquilarPaginadas(string nombreJuego, string plataformaJuego, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Codigo, Alquilada, Socio, Nombre, Apellidos, FechaInicio as Desde, FechaFin as Hasta ";
                select += "FROM (SELECT CopiasAlquiler.Codigo, Alquilada, Socio, Nombre, Apellidos, FechaInicio, FechaFin, ROW_NUMBER() OVER (ORDER BY CopiasAlquiler.Codigo ASC) AS ROW ";
                select += "      FROM CopiaFisica INNER JOIN  ";
                select += "           (SELECT Codigo, Alquilada, Socio, Nombre, Apellidos, FechaInicio, FechaFin ";
                select += "            FROM CopiaAlquiler LEFT OUTER JOIN Persona ";
                select += "            ON CopiaAlquiler.Socio = Persona.DNI) AS CopiasAlquiler ON CopiaFisica.Codigo = CopiasAlquiler.Codigo ";
                select += "      WHERE (NombreJuego = '" + nombreJuego + "') AND (Plataforma = '" + plataformaJuego + "')) AS CopiasAlquilerNumeradas ";
                select += "WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasAlquilerPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Función para obtener el número de copias físicas nuevas para vender de un juego especificado por parámetro
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se obtendrá el número de copias físicas nuevas para vender</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se obtendrá el número de copias físicas nuevas para vender</param>
        /// <returns>
        /// Devuelve el número de copias físicas nuevas para vender del juego especificado por parámetro</returns>
        public int ObtenerTodasLasCopiasFisicasNuevas(string nombreJuego, string plataformaJuego, bool noVendidas)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) FROM CopiaVenta, CopiaFisica WHERE (Tipo = 'Nueva') AND (CopiaFisica.Codigo = CopiaVenta.Codigo) AND (NombreJuego = @nombreJuego) AND (Plataforma = @plataformaJuego) ";
                if (noVendidas)
                    select += "AND SOCIO IS NULL";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombreJuego"].Value = nombreJuego;
                comandoSql.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataformaJuego"].Value = plataformaJuego;
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener los datos de las copias físicas nuevas para vender del juego especificado por parámetro paginadas
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se desea obtener los datos de las copias físicas nuevas para vender paginadas</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se desea obtener los datos de las copias físicas nuevas para vender paginadas</param>
        /// <param name="desde">
        /// Número correspondiente a la fila desde la cual se comenzaran a obtener los datos de la Base de Datos para la paginación</param>
        /// <param name="hasta">
        /// Número correspondiente a la fila hasta la cual se obtendrán los datos de la Base de Datos para la paginación</param>
        /// <returns>
        /// Devuelve un DataSet con los datos de las copias físicas nuevas para vender paginadas dentro de una tabla denominada "CopiasNuevasPaginadas"</returns>
        public DataSet ObtenerTodasLasCopiasFisicasNuevasPaginadas(string nombreJuego, string plataformaJuego, bool noVendidas, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Codigo, Socio, PrecioVenta AS 'Precio de venta' ";
                select += "FROM          (SELECT CopiaVenta.Codigo, Socio, PrecioVenta, ROW_NUMBER() OVER (ORDER BY CopiaVenta.Codigo ASC) AS ROW ";
                select += "FROM         CopiaVenta, CopiaFisica ";
                select += "WHERE        (NombreJuego = '" + nombreJuego + "') AND (Plataforma = '" + plataformaJuego + "') AND (CopiaFisica.Codigo = CopiaVenta.Codigo) AND (Tipo = 'Nueva') ";
                if (noVendidas)
                    select += "AND (Socio IS NULL)";
                select += ") AS CopiasAlquilerNumeradas ";
                select += "WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasNuevasPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Función para obtener el número de copias físicas de segunda mano para vender de un juego especificado por parámetro
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se obtendrá el número de copias físicas de segunda mano para vender</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se obtendrá el número de copias físicas de segunda mano para vender</param>
        /// <returns>
        /// Devuelve el número de copias físicas de segunda mano para vender del juego especificado por parámetro</returns>
        public int ObtenerTodasLasCopiasFisicasSegundaMano(string nombreJuego, string plataformaJuego, bool noVendidas)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) FROM CopiaVenta, CopiaFisica WHERE (Tipo = 'Segunda Mano') AND (CopiaFisica.Codigo = CopiaVenta.Codigo) AND (NombreJuego = @nombreJuego) AND (Plataforma = @plataformaJuego) ";
                if (noVendidas)
                    select += "AND SOCIO IS NULL";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombreJuego"].Value = nombreJuego;
                comandoSql.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataformaJuego"].Value = plataformaJuego;
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener los datos de las copias físicas de segunda mano para vender del juego especificado por parámetro paginadas
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se desea obtener los datos de las copias físicas de segunda mano para vender paginadas</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego del cual se desea obtener los datos de las copias físicas de segunda mano para vender paginadas</param>
        /// <param name="desde">
        /// Número correspondiente a la fila desde la cual se comenzaran a obtener los datos de la Base de Datos para la paginación</param>
        /// <param name="hasta">
        /// Número correspondiente a la fila hasta la cual se obtendrán los datos de la Base de Datos para la paginación</param>
        /// <returns>
        /// Devuelve un DataSet con los datos de las copias físicas de segunda mano para vender paginadas dentro de una tabla denominada "CopiasSegundaManoPaginadas"</returns>
        public DataSet ObtenerTodasLasCopiasFisicasSegundaManoPaginadas(string nombreJuego, string plataformaJuego, bool noVendidas, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Codigo, Socio, PrecioVenta AS 'Precio de venta' ";
                select += "FROM          (SELECT CopiaVenta.Codigo, Socio, PrecioVenta, ROW_NUMBER() OVER (ORDER BY CopiaVenta.Codigo ASC) AS ROW ";
                select += "FROM         CopiaVenta, CopiaFisica ";
                select += "WHERE        (NombreJuego = '" + nombreJuego + "') AND (Plataforma = '" + plataformaJuego + "') AND (CopiaFisica.Codigo = CopiaVenta.Codigo) AND (Tipo = 'Segunda Mano') ";
                if (noVendidas)
                    select += "AND SOCIO IS NULL";
                select += ") AS CopiasAlquilerNumeradas ";
                select += "WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasSegundaManoPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Función para insertar un número determinado de copias físicas del juego especificado por parámetro del tipo especificado, a la cual se le asignará un Código consecutivo empezando por el más alto presente en la Base de Datos + 1
        /// </summary>
        /// <param name="numeroCopias">
        /// Número de copias que se desean insertar</param>
        /// <param name="tipo">
        /// Tipo de las copias que se desean insertar. El valor "Alquiler" corresponde a copias para alquilar, "Nuevas" corresponde a copias nuevas para vender y "Segunda Mano" corresponde a copias de segunda mano para vender</param>
        /// <param name="nombreJuego">
        /// Nombre del juego al cual corresponden las copias físicas</param>
        /// <param name="plataformaJuego">
        /// Plataforma del juego a la cual corresponden las copias físicas</param>
        /// <returns>
        /// Devuelve True si se han podido realizar todas las inserciones, False en caso contrario</returns>
        public bool InsertarCopias(int numeroCopias, string tipo, string nombreJuego, string plataformaJuego)
        {
            bool resultado = false;

            try
            {
                for (int i = 1; i <= numeroCopias; i++)
                {
                    if (tipo == "Alquiler")
                    {
                        InsertarCopiaAlquiler(nombreJuego, plataformaJuego);
                    }
                    else if (tipo == "Nueva" || tipo == "Segunda Mano")
                    {
                        InsertarCopiaVenta(nombreJuego, plataformaJuego, tipo);
                    }
                }

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Función que devuelve el valor del código más alto de las copias físicas de la Base de Datos
        /// </summary>
        /// <returns>
        /// Devuelve el valor numérico correspondiente al valor más alto del código de las copias físicas de la Base de Datos. Devuelve 0 si no existen copias</returns>
        public int ObtenerCodigoMaximo()
        {
            int resultado = 0;
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT TOP (1) Codigo FROM CopiaFisica ORDER BY Codigo DESC";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr["Codigo"].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para borrar de la base de datos la copia física correspondiente al código especificado por parámetro
        /// </summary>
        /// <param name="codigo">
        /// Código de la copia física que se desea eliminar de la Base de Datos</param>
        /// <returns>
        /// Devuelve True si no ha ocurrido ningun error durante la eliminación, False en caso contrario</returns>
        public bool BorrarCopiaFisica(int codigo)
        {
            bool resultado = false;

            try
            {
                copiasFisicasTA.BorrarCopiaFisica(codigo);

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /************************************************** Fin Funciones de Marcos **************************************************/

        /***************************************Funciones Ruben********************************************************/

        /// <summary>
        /// Funcion que devuelve el numero de copias fisicas de un juego almacenado en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>        
        /// <returns>
        /// El numero de copias
        /// </returns>
        public int NumeroCopiasFisicas(string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                select += "SELECT     COUNT(*) ";
                select += " FROM          (SELECT     CopiaAlquiler.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, 'Alquiler' AS Tipo, Precio as Precio ";
                select += "                 FROM          CopiaAlquiler, CopiaFisica, Juego, Tarifa ";
                select += "                 WHERE CopiaAlquiler.Codigo = CopiaFisica.Codigo ";
                select += "                 AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma and tarifa.Categoria = juego.Tarifa ";
                select += "                 AND      (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (Alquilada = 'NO' or Alquilada is NULL) ";
                select += "             UNION ALL ";
                select += "                 SELECT     CopiaVenta.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, 'Nuevo' AS Tipo, PrecioNuevo as Precio ";
                select += "                 FROM         CopiaVenta ,CopiaFisica, Juego ";
                select += "                 WHERE CopiaVenta.Codigo = CopiaFisica.Codigo AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma ";
                select += "                 AND     (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (CopiaVenta.Tipo = 'Nueva') and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL) and (PrecioNuevo IS NOT NULL)";
                select += "             UNION ALL ";
                select += "                 SELECT     CopiaVenta.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, '2ª Mano' AS Tipo, PrecioSegundaMano as Precio ";
                select += "                 FROM         CopiaVenta ,CopiaFisica, Juego ";
                select += "                 WHERE CopiaVenta.Codigo = CopiaFisica.Codigo AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma ";
                select += "                 and     (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (CopiaVenta.Tipo = 'Segunda Mano') and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL) and (PrecioSegundaMano IS NOT NULL))  ";
                select += "                 AS derivedtbl_1Fi";

                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que devuelve las copias fisicas de un juego paginadas almacenadas en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>
        /// <param name="desde">
        /// Entero que indica desde que número de fila se desea mostrar</param>
        /// <param name="hasta">
        /// Entero que indica hasta que número de fila se desea mostrar</param>
        /// <returns>
        /// Las copias paginadas
        /// </returns>
        public DataSet CopiasFisicasPaginadas(string nombreJuego, string plataformaJuego, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "                SELECT     Codigo, Nombre, Plataforma, Tipo, Precio ";
                select += "FROM         (SELECT     Codigo, NombreJuego AS Nombre, Plataforma, Tipo, Precio, ROW_NUMBER() OVER (ORDER BY Codigo ASC) AS ROW ";
                select += "                       FROM          (SELECT     CopiaAlquiler.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, 'Alquiler' AS Tipo, Precio as Precio ";
                select += "                                               FROM          CopiaAlquiler, CopiaFisica, Juego, Tarifa ";
                select += "                                              WHERE CopiaAlquiler.Codigo = CopiaFisica.Codigo ";
                select += "AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma and tarifa.Categoria = juego.Tarifa ";
                select += "                                               AND      (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (Alquilada = 'NO' or Alquilada is NULL) ";
                select += "                                               UNION ALL ";
                select += "                                               SELECT     CopiaVenta.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, 'Nuevo' AS Tipo, PrecioNuevo as Precio ";
                select += "                                               FROM         CopiaVenta ,CopiaFisica, Juego ";
                select += "WHERE CopiaVenta.Codigo = CopiaFisica.Codigo AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma ";
                select += "                                               AND     (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (CopiaVenta.Tipo = 'Nueva') and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL) and (PrecioNuevo IS NOT NULL)";
                select += "                                               UNION ALL ";
                select += "                                               SELECT     CopiaVenta.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, '2ª Mano' AS Tipo, PrecioSegundaMano as Precio ";
                select += "                                               FROM         CopiaVenta ,CopiaFisica, Juego ";
                select += "WHERE CopiaVenta.Codigo = CopiaFisica.Codigo AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma ";
                select += "                                              and     (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (CopiaVenta.Tipo = 'Segunda Mano')and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL) and (PrecioSegundaMano IS NOT NULL))  ";
                select += "                                              AS derivedtbl_1) AS CopiasFisicasNumeradas ";
                select += "WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ") ";




                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasFisicasPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Funcion que devuelve el numero de copias fisicas de alquiler de un juego almacenado en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>        
        /// <returns>
        /// El numero de copias
        /// </returns>
        public int NumeroCopiasFisicasParaAlquilar(string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                select += "SELECT COUNT(*) FROM CopiaAlquiler, CopiaFisica WHERE (CopiaFisica.Codigo = CopiaAlquiler.Codigo) AND (NombreJuego LIKE '%" + nombreJuego + "%') AND (Plataforma LIKE '%" + plataformaJuego + "%') AND (CopiaAlquiler.Alquilada = 'NO' or CopiaAlquiler.Alquilada is NULL) ";
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que devuelve las copias fisicas de alquiler de un juego paginadas almacenadas en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>
        /// <param name="desde">
        /// Entero que indica desde que número de fila se desea mostrar</param>
        /// <param name="hasta">
        /// Entero que indica hasta que número de fila se desea mostrar</param>
        /// <returns>
        /// Las copias paginadas
        /// </returns>
        public DataSet CopiasFisicasParaAlquilarPaginadas(string nombreJuego, string plataformaJuego, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "                SELECT     Codigo, Nombre, Plataforma, Tipo, Precio ";
                select += "                 FROM         (  SELECT     Codigo, NombreJuego AS Nombre, Plataforma, Tipo, Precio, ROW_NUMBER() OVER (ORDER BY Codigo ASC) AS ROW ";
                select += "                                 FROM(   SELECT     CopiaAlquiler.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, 'Alquiler' AS Tipo, Precio as Precio ";
                select += "                                         FROM          CopiaAlquiler, CopiaFisica, Juego, Tarifa ";
                select += "                                         WHERE CopiaAlquiler.Codigo = CopiaFisica.Codigo ";
                select += "                                         AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma and tarifa.Categoria = juego.Tarifa ";
                select += "                                         AND      (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (Alquilada = 'NO' or Alquilada is NULL) ";
                select += "                                 )AS derivedtbl_1) AS CopiasAlquilerNumeradas ";
                select += "                  WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ") ";
                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasAlquilerPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Funcion que devuelve el numero de copias fisicas nuevas de un juego almacenado en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>        
        /// <returns>
        /// El numero de copias
        /// </returns>
        public int NumeroCopiasFisicasNuevas(string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                select += "SELECT COUNT(*) FROM CopiaVenta, CopiaFisica CF, Juego J WHERE (Tipo = 'Nueva') AND (CF.Codigo = CopiaVenta.Codigo) AND (CF.NombreJuego = J.Nombre) and (CF.Plataforma = J.Plataforma)";
                select += "AND (NombreJuego LIKE '%" + nombreJuego + "%') AND (CF.Plataforma LIKE '%" + plataformaJuego + "%') and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL) and (PrecioNuevo IS NOT NULL)";
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que devuelve las copias fisicas nuevas de un juego paginadas almacenadas en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>
        /// <param name="desde">
        /// Entero que indica desde que número de fila se desea mostrar</param>
        /// <param name="hasta">
        /// Entero que indica hasta que número de fila se desea mostrar</param>
        /// <returns>
        /// Las copias paginadas
        /// </returns>
        public DataSet CopiasFisicasNuevasPaginadas(string nombreJuego, string plataformaJuego, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "SELECT     Codigo, Nombre, Plataforma, Tipo, Precio ";
                select += "FROM         (SELECT     Codigo, NombreJuego AS Nombre, Plataforma, Tipo, Precio, ROW_NUMBER() OVER (ORDER BY Codigo ASC) AS ROW ";
                select += "              FROM          (SELECT     CopiaVenta.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, 'Nuevo' AS Tipo, PrecioNuevo as Precio ";
                select += "                             FROM         CopiaVenta ,CopiaFisica, Juego ";
                select += "                             WHERE CopiaVenta.Codigo = CopiaFisica.Codigo AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma ";
                select += "                             AND     (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (CopiaVenta.Tipo = 'Nueva') and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL) and (PrecioNuevo IS NOT NULL)";
                select += "              )AS derivedtbl_1) AS CopiasFisicasNumeradas ";
                select += "WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ") ";

                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasNuevasPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Funcion que devuelve el numero de copias fisicas de segunda mano de un juego almacenado en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>        
        /// <returns>
        /// El numero de copias
        /// </returns>
        public int NumeroCopiasFisicasSegundaMano(string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                select += "SELECT COUNT(*) FROM CopiaVenta, CopiaFisica CF, Juego J WHERE (Tipo = 'Segunda Mano') AND (CF.Codigo = CopiaVenta.Codigo) AND (CF.NombreJuego = J.Nombre) and (CF.Plataforma = J.Plataforma) ";
                select += "AND (NombreJuego LIKE '%" + nombreJuego + "%') AND (CF.Plataforma LIKE '%" + plataformaJuego + "%') and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL) and (PrecioSegundaMano IS NOT NULL)";
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que devuelve las copias fisicas de segunda mano de un juego paginadas almacenadas en la BD
        /// </summary>        
        /// <param name="nombreJuego">
        /// El nombre del juego</param>
        /// <param name="plataformaJuego">
        /// La plataforma del juego</param>
        /// <param name="desde">
        /// Entero que indica desde que número de fila se desea mostrar</param>
        /// <param name="hasta">
        /// Entero que indica hasta que número de fila se desea mostrar</param>
        /// <returns>
        /// Las copias paginadas
        /// </returns>
        public DataSet CopiasFisicasSegundaManoPaginadas(string nombreJuego, string plataformaJuego, int desde, int hasta)
        {
            DataSet copiasFisicasPaginadas = new DataSet();
            string select = "";

            try
            {
                select += "                SELECT     Codigo, Nombre, Plataforma, Tipo, Precio ";
                select += "FROM         (SELECT     Codigo, NombreJuego AS Nombre, Plataforma, Tipo, Precio, ROW_NUMBER() OVER (ORDER BY Codigo ASC) AS ROW ";
                select += "                       FROM          (SELECT     CopiaVenta.Codigo, CopiaFisica.NombreJuego, CopiaFisica.Plataforma, '2ª Mano' AS Tipo, PrecioSegundaMano as Precio ";
                select += "                                               FROM         CopiaVenta ,CopiaFisica, Juego ";
                select += "WHERE CopiaVenta.Codigo = CopiaFisica.Codigo AND CopiaFisica.NombreJuego = Juego.Nombre and CopiaFisica.Plataforma = Juego.Plataforma ";
                select += "                                              and     (CopiaFisica.NombreJuego LIKE '%" + nombreJuego + "%') AND (CopiaFisica.Plataforma LIKE '%" + plataformaJuego + "%') AND (CopiaVenta.Tipo = 'Segunda Mano')and (CopiaVenta.Socio = '' or CopiaVenta.Socio IS NULL))  ";
                select += "                                              AS derivedtbl_1) AS CopiasFisicasNumeradas ";
                select += "WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ") ";

                copiasFisicasPaginadas = ObtenerDatos(select, "CopiasSegundaManoPaginadas");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return copiasFisicasPaginadas;
        }

        /// <summary>
        /// Funcion que devuelve los datos de un alquiler
        /// </summary>        
        /// <param name="codigo">
        /// El codigo de la copia del juego</param>
        /// <returns>
        /// Un dataset con la informacion del alquiler de la copia
        /// </returns>
        public DataSet ObtenerDatosAlquiler(string codigo)
        {
            DataSet datosAlquiler = new DataSet();
            string select = "";

            try
            {
                select += "select CA.Codigo as Codigo, CA.FechaFin as FDevolucion, CA.Socio as Socio, CF.NombreJuego as Juego, CF.Plataforma as Plataforma, J.Caratula as Caratula, T.Recargo as Recargo ";
                select += "from CopiaAlquiler CA, CopiaFisica CF, Juego J, Tarifa T ";
                select += "where CA.Codigo = CF.Codigo and CF.NombreJuego = J.Nombre and CF.Plataforma = J.Plataforma and J.Tarifa = T.Categoria ";
                select += "and CA.Codigo = '" + codigo + "' and CA.Alquilada = 'si' ";

                datosAlquiler = ObtenerDatos(select, "DatosAlquiler");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return datosAlquiler;
        }

        /// <summary>
        /// Funcion que cambia el estado de alquiler de una copia a devuelto
        /// </summary>        
        /// <param name="codigo">
        /// El codigo de la copia del juego</param>       
        /// <returns>
        /// Un booleano que indica si se ha devuelto correctamente
        /// </returns>
        public bool DevolverJuego(string codigo)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlTransaction tr = null;
            SqlCommand comandoSql;
            string update = "";

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                tr = conexion.BeginTransaction();

                update = "UPDATE CopiaAlquiler ";
                update += "SET Alquilada = 'No', Socio = NULL, FechaInicio = NULL, FechaFin = NULL ";
                update += "WHERE (Codigo = '" + codigo + "')";

                comandoSql = new SqlCommand(update, conexion);
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                tr.Commit();
                resultado = true;
            }
            catch (Exception ex)
            {
                tr.Rollback();
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que cambia el estado de alquiler de una copia a alquilada
        /// </summary>        
        /// <param name="codigo">
        /// El codigo de la copia del juego</param>
        /// <param name="socio">
        /// El dni del socio</param>
        /// <returns>
        /// Un booleano que indica si se ha alquilado correctamente
        /// </returns>
        public bool SetCopiaAlquilada(string codigo, string socio)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlTransaction tr = null;
            SqlCommand comandoSql;
            string update = "";

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                tr = conexion.BeginTransaction();

                update += "UPDATE CopiaAlquiler ";
                update += "SET Alquilada = 'Si', Socio = '" + socio + "', FechaInicio = getdate(), FechaFin =  ";
                update += "     (SELECT        GETDATE() + T.NumeroDias ";
                update += "     FROM            Tarifa AS T INNER JOIN ";
                update += "                         Juego AS J ON T.Categoria = J.Tarifa INNER JOIN ";
                update += "                         CopiaFisica AS CF ON J.Nombre = CF.NombreJuego AND J.Plataforma = CF.Plataforma ";
                update += "     WHERE        (CF.Codigo = " + codigo + ")) ";
                update += "WHERE Codigo = " + codigo;
                
                comandoSql = new SqlCommand(update, conexion);
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                tr.Commit();
                resultado = true;
            }
            catch (Exception ex)
            {
                tr.Rollback();
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que cambia el estado de una copia a vendida
        /// </summary>        
        /// <param name="codigo">
        /// El codigo de la copia del juego</param>      
        /// <param name="socio">
        /// El socio al que se le ha vendido</param> 
        /// <param name="precio">
        /// El precio por el que se ha vendido la copia del juego</param>      
        /// <returns>
        /// Un booleano que indica si se ha modificado la BD correctamente
        /// </returns>
        public bool SetCopiaVendida(string codigo, string socio, string precio)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlTransaction tr = null;
            SqlCommand comandoSql;
            string update = "";

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();
                SqlParameter param = new SqlParameter("@precio", decimal.Parse(precio));

                tr = conexion.BeginTransaction();

                update += "UPDATE CopiaVenta ";
                update += "SET Socio = '" + socio + "', PrecioVenta = @precio ";
                update += "WHERE Codigo = " + codigo;

                comandoSql = new SqlCommand(update, conexion);
                comandoSql.Parameters.Add(param);
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                tr.Commit();
                resultado = true;
            }
            catch (Exception ex)
            {
                tr.Rollback();
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que devuelve el numero de copia de un juego
        /// </summary>        
        /// <param name="nombre">
        /// El nombre del juego</param>      
        /// <param name="plataforma">
        /// La plataforma del juego</param> 
        /// <param name="tipo">
        /// El tipo de juego (nuevo o segunda mano)</param>      
        /// <returns>
        /// El codigo de la copia
        /// </returns>
        public string GetNumCopia(string nombre, string plataforma, string tipo)
        {
            string numCopia = "";
            string select = "";
            SqlConnection conexion = null;

            try
            {
                select += "SELECT        MIN(CF.Codigo) AS Expr1 ";
                select += "FROM            CopiaFisica AS CF INNER JOIN CopiaVenta AS CV ON CF.Codigo = CV.Codigo ";
                select += "WHERE        (CF.NombreJuego = '" + nombre + "') AND (CV.Socio IS NULL) AND (CF.Plataforma = '" + plataforma + "') AND (CV.Tipo = '";
                if(tipo == "nuevo")
                    select += "Nueva') ";
                else if(tipo == "segunda")
                    select += "Segunda Mano') ";
                select += "GROUP BY CF.NombreJuego, CF.Plataforma, CV.Tipo ";

                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    numCopia = dr[0].ToString();
            }
            catch (Exception ex)
            {                
                throw ex;
            }
            return numCopia;
        }

        /***************************************Fin Funciones Ruben********************************************************/

    }
}
